iT邦幫忙

1

YOLO v4 模型訓練實作

  • 分享至 

  • xImage
  •  

前言

之前一篇『YOLO v4 建置心得 -- Windows 環境』介紹如何建置 YOLO4(Darknet),並進行物件偵測(Object Detection), 但是,下載的標準模型只能偵測 MS COCO 資料集的80種物件,如果要偵測自訂的物件,就必須使用自訂資料集來訓練模型,因此,以下就來實作模型訓練。

準備訓練資料

YOLO 模型訓練主要分兩個步驟:

  1. 標註資料:可使用各式標註工具,將圖像內的物件框起來,一般存檔的格式有YOLO、COCO、VOC等,本文使用的是YOLO格式。
  2. 模型訓練:有了圖像及標註檔後,就可以進行模型訓練,以下會詳細介紹完整的程序。

標註工具有LabelImg、LabelMe等軟體,可參閱『13 Best Image Annotation Tools of 2021』。常用的是LabelImg,相關指令如下:
安裝:pip install LabelImg
執行:LabelImg
操作可參閱『LabelImg 影像標註工具使用教學,製作深度學習用的資料集』

兩個步驟都非常費時,因此,本文選擇直接下載已標註好的資料集,只有一個類別 -- 兔子,網址為『Eastern Cottontail Rabbits Dataset』。 內容是一個圖檔(.jpg)對應一個同名的備註檔(.txt),備註檔的格式有五欄:類別代碼、物件左上角X軸座標、左上角Y軸座標、物件寬度、物件高度。

訓練

訓練程序詳閱『YOLO v4 官網』

因為程序實在非常冗長,因此筆者稍作整理,以方便讀者快速設定。

  1. 建置 Darknet執行檔,請參閱『YOLO v4 安裝心得 -- Windows 環境』

  2. 下載預訓模型 yolov4.conv.137 至 weights 目錄(需新增)。

  3. 切換至 darknet-master\build\darknet\x64 目錄。

  4. 複製 cfg\yolov4-custom.cfg 為 cfg\yolo-obj.cfg。以下5~10步驟修改yolo-obj.cfg檔案內設定。

  5. batch=16:原始文件為64,批次過大會造成筆者PC記憶體不足(GPU),讀者可依據本身的GPU記憶體調配。記憶體不足的錯誤訊息為『Error: cuDNN isn't found FWD algo for convolution』。

  6. max_batches=2000:公式為 類別數(classes) x 2000。

  7. steps=1600,1800:公式為 max_batches 的 80%、90%。

  8. 設定模型輸入的圖像尺寸。
    width=416
    height=416

  9. [yolo]段落的classes=80更改為classes=1:共3個,可直接使用編輯器的『取代』直接置換,須視類別個數調整

  10. [yolo]段落的上面一個[convolutional]段落的filters=255更改為filters=18,共3個,請小心修改,filters值須視類別個數調整,公式為(類別個數+5) x 3。

  11. 新增檔案 build\darknet\x64\data\obj.names,內容如下,須列出所有類別:
    Rabbits

  12. 新增檔案 build\darknet\x64\data\obj.data,內容如下:

# 視類別個數調整
classes = 1
train = data/train.txt
valid = data/test.txt
names = data/obj.names
backup = backup/
  1. 複製訓練資料(*.jpg、 *.txt) 至 build\darknet\x64\data\obj\ 目錄(需新增)。部分檔名過長,訓練可能出現錯誤,可修改成較短的檔名。使用Labelimg開啟上述目錄,可觀看標註的圖像,如下:
    https://ithelp.ithome.com.tw/upload/images/20220119/20001976LZGMRkGzCy.png

  2. 新增檔案 build\darknet\x64\data\train.txt,檔案內容為每個圖像檔名。前面加data/obj/。

  3. 訓練指令如下,若訓練時有些檔案找不到,試著將檔名及txt檔名改短:
    darknet.exe detector train data/obj.data cfg/yolo-obj.cfg weights/yolov4.conv.137

  4. 筆者訓練約2小時,過程的損失函數如下圖,最後會存至 chart_yolo-obj.png。
    https://ithelp.ithome.com.tw/upload/images/20211111/20001976lgSNCDkJOW.png

  5. 訓練後的權重檔會儲存在backup目錄,檔名為 yolo-obj_final.weights。

  6. 如果訓練中途停止,或要延長訓練週期,可執行指令如下:
    darknet.exe detector train data/obj.data cfg/yolo-obj.cfg backup\yolo-obj_2000.weights

其中yolo-obj_2000.weights為執行2000訓練週期的權重檔,以上指令表示由第2000週期繼續訓練。

  1. 測試指令如下:
darknet.exe detector test data/obj.data cfg\yolo-obj.cfg backup\yolo-obj_final.weights 

或者

darknet detector test data/obj.data cfg/yolo-obj.cfg backup\yolo-obj_final.weights data\obj\4616855_80b098a3_jpg.rf.a0a319f1836215681493f06c81856b99.jpg

或者一次測試多個檔案:

darknet detector test data/obj.data cfg/yolo-obj.cfg backup\yolo-obj_final.weights < data/train.txt

輸出如下:
https://ithelp.ithome.com.tw/upload/images/20211111/200019764gCrdrYCkV.png

Python 測試

修改darknet.py 最後第三行,指定相關設定檔:

import sys

print(performDetect(sys.argv[1], configPath = "./cfg/yolo-obj.cfg", weightPath = "./backup/yolo-obj_final.weights", metaPath= "./data/obj.data"))

測試指令如下:

python .\darknet_custom.py data\obj\4616855_80b098a3_jpg.rf.a0a319f1836215681493f06c81856b99.jpg

輸出如下:
https://ithelp.ithome.com.tw/upload/images/20211111/20001976hwlIhAETBo.png

也可以自網路上下載圖檔試試看,注意要是同品種的兔兔,白兔可認不出來喔。

工商廣告一下:
PyTorch:
開發者傳授 PyTorch 秘笈
https://ithelp.ithome.com.tw/upload/images/20220531/20001976MhL9K2rsgO.png
預計 2022/6/20 出版。

TensorFlow:
深度學習 -- 最佳入門邁向 AI 專題實戰
https://ithelp.ithome.com.tw/upload/images/20220531/20001976ZOxC7BHyN3.jpg


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
joy45689
iT邦新手 5 級 ‧ 2022-01-21 14:27:52

感謝分享!!!

另外在跟著實作的過程,有發現步驟10的filters=8應該改為filters=18

Joy,

謝謝你的指正,文章已更新。

我要留言

立即登入留言